/*
 * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *      http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import { App, Select } from "antd";
import {
  CommandResult,
  type Identifier,
  RecoverableType,
} from "@ahoo-wang/fetcher-wow";
import { executionFailedCommandClient } from "../../services";
import type { OnChangedCapable } from "./Actions.tsx";
import type { MarkRecoverable } from "../../generated";
import { useExecutePromise } from "@ahoo-wang/fetcher-react";
import { FetcherError } from "@ahoo-wang/fetcher";

export interface MarkRecoverableProps
  extends Identifier,
    MarkRecoverable,
    OnChangedCapable {}

export function MarkRecoverable({
  id,
  recoverable,
  onChanged,
}: MarkRecoverableProps) {
  const { notification } = App.useApp();
  const promiseState = useExecutePromise<CommandResult, FetcherError>({
    onSuccess: () => {
      notification.success({ message: "Mark recoverable success." });
      onChanged?.();
    },
    onError: (error) => {
      notification.error({
        message: "Mark recoverable failed.",
        description: error.message,
      });
    },
  });
  const recoverableOptions = Object.values(RecoverableType).map(
    (recoverable) => ({
      value: recoverable,
    }),
  );
  const change = (recoverable: RecoverableType) => {
    promiseState.execute(async () => {
      return executionFailedCommandClient.markRecoverable(id, {
        body: { recoverable },
      });
    });
  };

  return (
    <>
      <Select
        defaultValue={recoverable}
        options={recoverableOptions}
        onChange={change}
        size="small"
        loading={promiseState.loading}
      ></Select>
    </>
  );
}
